const multer = require('multer');
const path = require('path');
const fs = require('fs');
const { v4: uuidv4 } = require('uuid');
const AppError = require('../utils/AppError');
const { sendResult } = require('../utils/tools');
const { servers } = require('../config');

const storage = multer.diskStorage({
	destination: function (req, file, cb) {
		// 文件存在当前目录出发，上级的public，下的uploads中
		const uploads = path.resolve(__dirname, '../public/static/uploads', 'origin');
		req.mkdir(uploads);
		cb(null, uploads);
	},
	filename: function (req, file, cb) {
		cb(null, uuidv4() + path.extname(file.originalname));
	}
});

const upload = multer({
	// 使用本地存储（根据需求可以换成云存储，或其他存储）
	storage: storage, // 本地临时保存,
	limits: {
		fileSize: 10 * 1024 * 1024 // 限制文件最大不超过 10M
	},
	async fileFilter(req, file, cb) {
		// 上传文件过滤
		if (await req.getImageFormat(file.originalname)) {
			cb(null, true); // 符合要求，接受这个文件
		} else {
			cb(new Error('必须是一个图片')); // 进入错误中间件
		}
	}
});

// 文件上传
exports.uploadSingle = function () {
	return upload.single('file');
};

// minio存储
const Minio = require('minio');
const minioClient = new Minio.Client({
	endPoint: servers.host, // MinIO 服务地址
	port: 9001, // MinIO 服务端口
	useSSL: false, // 是否使用 HTTPS
	accessKey: 'c13HtgFPEpKZHbq5PL9X', // Access Key
	secretKey: 'RYK8oLTWE9gZDmwre5Qis7iNkHbBY4Nc7Hhxb9gb' // Secret Key
});
minioClient.setRequestOptions({ rejectUnauthorized: false }); // 忽略 SSL 证书验证（仅用于测试）

exports.uploadMinio = function (req, res, next) {
	if (!req.file) return next(new AppError('No file uploaded'));

	const filePath = req.file.path;
	const bucketName = 'express-orm-bucket'; // 替换为你的 Bucket 名称
	const objectName = `${uuidv4()}${path.extname(req.file.originalname)}`; // 生成唯一的文件名

	// 上传文件到 MinIO
	minioClient.fPutObject(bucketName, objectName, filePath, (err, etag) => {
		if (err) return next(new AppError(err, 500));

		// 删除临时文件
		fs.unlinkSync(filePath);

		// 返回文件访问地址
		const fileUrl = `http://${servers.host}:9002/api/v1/buckets/${bucketName}/objects/download?preview=true&prefix=${objectName}`;
		res.send(sendResult(fileUrl, '文件上传成功'));
	});
};

// 七牛OSS测试（云服务会过期）
const qiniu = require('qiniu'); // V6文档对应 qiniu@6.x版本
exports.uploadQiniu = function (req, res, next) {
	//需要填写你的 Access Key 和 Secret Key
	qiniu.conf.ACCESS_KEY = 'TemycUPybAbGS2XwVvzDPFQRIiIu07_AZVsQFjp-';
	qiniu.conf.SECRET_KEY = 'ikjgLIHOvJPkiQEpMdQu6OadfZva-HbIrDxy3_F9';
	const bucket = 'test-1122334'; // 仓库名（空间名）
	const domain = 'http://st3uuzeca.hn-bkt.clouddn.com'; // 创建空间时分配的域名

	// 生成唯一的文件名
	const key = `uploads/${uuidv4()}${path.extname(req.file.originalname)}`;
	//构建上传策略函数
	function uptoken(bucket, key) {
		var putPolicy = new qiniu.rs.PutPolicy(bucket + ':' + key);
		return putPolicy.token();
	}
	//生成上传 Token
	const token = uptoken(bucket, key);

	//构造上传函数
	function uploadFile(uptoken, key, localFile) {
		var extra = new qiniu.io.PutExtra();
		qiniu.io.putFile(uptoken, key, localFile, extra, function (err, ret) {
			if (!err) {
				// 上传成功， 处理返回值
				res.send(
					sendResult({
						retHash: ret.hash,
						url: `${domain}/${ret.key}?e=${new Date().getTime()}&toekn=${ret.hash}`,
						path: ret.key
					})
				);
			} else {
				// 上传失败， 处理返回代码
				return next(AppError(err));
			}
		});
	}
	//调用uploadFile上传
	uploadFile(token, key, req.file.path);
};
